#include "test20_StlAbstract.h"
#include "test01_Namespace.h"



// stl引入

// 6组件
// 8容器
// 若干算法

// 参考资料
// https://blog.csdn.net/qq_42322103/article/details/99685797
// http://c.biancheng.net/stl/


void test20_StlAbstract::classMain()
{
	std::cout << "test20_StlAbstract" << "\n";
	// stl嵌套使用
	this->testWorker();

}


// 教程网址
// http://c.biancheng.net/stl/


// 容器 - 存储并管理某类对象的集合。容器分为序列容器和关联容器
// 迭代器 - 在一个对象集群上进行遍历。迭代器分两类，双向迭代器和随机存取迭代器
// 算法 - 算法用于处理集群内的元素，可实现搜寻，排序，修改，使用
// 仿函数 - 具有泛型编程强大的威力，是纯粹抽象的例证


// stl综合使用案例
int test20_StlAbstract::stlUse()
{
	int ia[6] = {}; // 使用{}初始化 = 全0
	std::vector<int, std::allocator<int>> vi(ia, ia + 6); // 使用std::vector提供的构造函数进行初始化，且指定初始化范围
	// std::count_if 将遍历容器 vi 中的所有元素，并对每个元素调用判断条件，如果该元素满足条件，则累加计数器
	std::cout << std::count_if(
		vi.begin(), // 容器中第一个元素的迭代器
		vi.end(), // 最后一个元素的下一个位置的迭代器
		std::not1( // 使用 std::not1() 函数取该一元函数对象的逆
			std::bind2nd( // std::bind2nd() 是一个函数适配器，用于将一个二元函数对象的第二个参数绑定为指定值，从而得到一个一元函数对象
				std::less<int>(), // std::less<int>() 是一个函数对象，表示小于比较运算符 <，用于比较两个整数的大小
				40) // 整体表示不小于 40 的整数
		)
	);
	return 0;
}

// 创建一个员工，移动距离默认
test20_StlAbstract::MyWorker test20_StlAbstract::creactWorker(int id,std::string name, std::string nameE, int age,
	std::string dir,int dis)
{
	test20_StlAbstract::MyWorker w1;
	w1.id = id;
	w1.name = name;
	w1.nameE = nameE;
	w1.age = age;
	test20_StlAbstract::Behavior beh;
	beh.direction = dir;
	beh.distance = dis;
	return w1;
}

int test20_StlAbstract::testWorker()
{
	// 创建10个员工
	std::list<MyWorker> workerList; // 初始化一个空的list
	for (size_t i = 0; i < 10; i++)
	{
		test20_StlAbstract::MyWorker zhangSan = test20_StlAbstract::creactWorker(1+i, test01::CodeUtils::Utf8ToGbk("张三") + std::to_string(i), 
			"zhangsan" + std::to_string(i), 13 + i, test01::CodeUtils::Utf8ToGbk("向前"), 10 + i);
		workerList.push_back(zhangSan);
	}

	// 匹配"张三5"
	for (auto it:workerList)
	{
		if (it.nameE == "zhangsan5")
		{
			it.beh.direction = "向后";
		}
	}
	
	
	
	return 0;
}


